package lucky.xiong.api.Stream流;

import org.junit.Test;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * 消费函数
 * @author XiongJianLin
 * @date Created in 2021/11/4 9:51
 */
public class BiConsumerTest {
    @Test
    public void consumer() {
        StringBuilder sb = new StringBuilder("bbbb");
        // 声明式函数对象 Consumer
        Consumer<StringBuilder> consumer = (str) -> str.append("aaaa");
        // accept()对给定参数执行此操作   ,及 把sb 带入到 (str) 函数中执行函数中方法
        consumer.accept(sb);
        System.out.println(sb);
    }

    /**
     * BiConsumer
     * 代表一个接受两个输入参数并且不返回结果的操作。
     * 这是对Consumer的两元特化
     * 与其他大多数函数式接口不同，BiConsumer被期望通过副作用来操作。
     */
    @Test
    public void biConsumerTest(){
        StringBuilder sb = new StringBuilder();
        // 声明式函数式对象 ， 声明函数怎么使用
        BiConsumer<String, String> consumer = (s, s2) ->
            // 组装s 和 s2
            sb.append(s).append(" + ").append(s2);
        // 调用函数 , 并传入两个参数
        consumer.accept("字符串1","字符串2");
        System.out.println(sb);

        /* after then */
        StringBuilder sb2 = new StringBuilder("Hello ");
        Consumer<StringBuilder> c1 = (str) -> str.append("Jack!");
        Consumer<StringBuilder> c2 = (str) -> str.append(" Bob!");
        /*返回一个组合的Consumer ，它依次执行此操作和after操作。 如果执行任一操作引发异常，则将其转发给组合操作的调用者。
        如果执行此操作抛出异常，则不会执行after操作。*/
        c1.andThen(c2).accept(sb2);
        // Hello Jack! Bob!
        System.out.println(sb2);

    }

}
